import 'dart:io';
import 'dart:math';

void main() {
  // 1. 泛型 约束 List 元素的数据类型
  List<int> list1 = [1, 2, 3, 4, 5];
  List<String> list2 = ['hello', 'world'];
  print('list1: $list1');
  print('list2: $list2');

  // 2. 泛型 约束 Map 键值对的数据类型
  Map<int, String> map1 = {1: 'hello', 2: 'world'};
  Map<String, double> map2 = {'a': 1.2, 'b': 3.4};
  print('map1: $map1');
  print('map2: $map2');

  // 3. 泛型 约束函数参数的数据类型
  int result1 = getParams<int>(10);
  String result2 = getParams<String>('hello');
  print('result1: $result1');
  print('result2: $result2');

  // 4. 泛型 约束 Future 异步返回的数据类型
  getData()
      .then((data) {
        print('获取到的数据: $data');
      })
      // catchError 捕获异常
      .catchError((error) {
        print('错误原因: $error');
      })
      // whenComplete 无论是否有异常都会执行
      .whenComplete(() {
        print('getData 执行完毕');
      });

  handleGetData();
}

T getParams<T>(T data) {
  return data;
}

Future<int> getData() {
  return Future(() {
    int num = Random().nextInt(100);
    sleep(Duration(seconds: 2));
    if (num >= 30) {
      return num;
    } else {
      throw Exception('获取数据失败');
    }
  });
}

handleGetData() async {
  try {
    var res = await getData();
    print('获取到的数据: $res');
  } catch (e) {
    print('错误原因: $e');
  }
  // 无论是否有异常都会执行
  finally {
    print('finally');
  }
}
